﻿<!DOCTYPE HTML>
<html lang="zh">
<head>
<title>#警告 - 语法 &amp; 使用 | AutoHotkey v2</title>
<meta name="description" content="The #警告 directive enables or disables warnings 遍历 specific conditions which may indicate an error, such as a typo or missing &quot;global&quot; declaration." />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
<script type="text/javascript">$(function(){0<=window.navigator.userAgent.toLowerCase().indexOf("ucbrowser")&&CaoNiMaDeUc()})</script>
</head>
<body>

<h1>#警告</h1>

<p>启用或禁用特定条件下的警告, 这些条件可能会产生错误, 例如书写错误或缺少 "全局" 声明.</p>

<pre class="Syntax"><span class="func">#警告</span> <span class="optional">WarningType, WarningMode</span></pre>

<h2 id="Parameters">参数</h2>
<dl>

  <dt>WarningType</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>

    <p>要启用或禁用的警告类型. 如果省略, 默认为 <i>All</i>.</p>
    <p class="warning"><strong>注意:</strong> UseUnset 警告是默认启用的. 不建议禁用它们, 因为有计划删除该选项并以错误代替警告.</p>
    <p id="UseUnset"><strong>UseUnsetLocal</strong> 或 <strong>UseUnsetGlobal</strong>: 在读取之前没有赋值或使用 <a href="VarSetStrCapacity.htm">VarSetStrCapacity</a> 初始化的变量时产生警告. 如果期望这种变量为空, 则可以为它赋值空字符串来屏蔽这样的警告.</p>
    <p><a href="IsSet.htm">是否赋值</a> 可以用来检测一个变量是否被设置而不触发警告, 无论警告是否被启用.</p>
    <p>对于 信息框 模式, 每个全局变量或每次调用函数时每个局部变量只显示一个警告. 这是通过在显示警告时初始化变量来实现的, 因此后续对 <a href="IsSet.htm">是否赋值</a> 的调用也会受到影响.</p>
    <p>之所以将其分为局部和全局的单独警告类型, 是因为由于全局变量的持久性和全脚本范围的特性, 在没有事先初始化的情况下使用全局变量是比较常见的. 出于这个原因, 一些脚本作者可能希望为局部启用这种类型的警告, 而为全局禁用它.</p>
    <pre>#警告
<em>;y := ""  ; 这将屏蔽警告.</em>
x := y    <em>; y 还没有被赋值.</em></pre>
    <p id="VarUnset"><strong>VarUnset</strong>: 在脚本开始运行之前, 为每个从未以下列任何方式使用的变量的第一个引用显示一个警告:</p>
    <ul>
      <li>作为一个直接的, 非动态赋值的目标, 如 <code>变量 :=  ""</code>.</li>
      <li>在非动态函数调用中传递给输出或 ByRef 参数.</li>
      <li>在一个非动态函数调用中传递给 是否赋值. 例如, 一个包含 <code>是否赋值(MyLib_Global)</code> 的脚本不会警告任何其他对同一变量的引用, 但可能会警告其他名为 <code>MyLib_Global</code> 的变量.</li>
      <li>传递给动态函数调用或方法调用的参数(不管它是否是 ByRef, 因为在加载时无法确定).</li>
    </ul>
    <p class="warning"><strong>已知限制:</strong> 虽然具有短路能力的运算符(如 <code>&amp;&amp;</code>, <code>||</code> 和三元运算符) 可以为赋值或 ByRef 参数产生一个变量引用, 但目前只有右边的分支被识别为赋值. 例如, <code>获取鼠标位置(b ? x1 : x2)</code> 可能只将 <code>x2</code> 标记为赋值.</p>
    <p id="LocalSameAsGlobal"><strong>LocalSameAsGlobal</strong>: 在脚本开始运行之前, 为每个 <em>未声明</em> 的局部变量显示一个警告, 该变量的名称与全局变量相同. 这是为了防止在试图访问全局变量之前, 忘记在函数中声明全局变量而导致的错误. 如果该变量确实是局部变量, 那么可以使用诸如 <code>local x</code> 或 <code>静态 y</code> 这样的声明来抑制该警告. 对于<a href="../Functions.htm#ForceLocal">强制-局部</a>函数中的变量, 不会显示这个警告.</p>
    <p>默认情况下, 这个警告是禁用的.</p>
    <pre>#警告
g := 1
ShowG() {       <em>; 即使从未调用这个函数也会显示警告.</em>
    <em>;global g   ; &lt;-- 访问全局变量时需要这行.</em>
    信息框 g  <em>; 没有声明, 所以 "g" 是个空的局部变量.</em>
}</pre>
    <p id="Unreachable"><strong>Unreachable</strong>: 在脚本开始运行之前, 对紧跟在同一嵌套层的 <code>返回</code>, <code>跳出</code>, <code>跳过</code>, <code>报错</code> 或 <code>跳转</code> 之后的每一行发出警告, 除非该行是一个标签的目标. 任何这样的行都不会被执行.</p>
    <p>如果代码的目的是不可到达的 - 例如, 如果使用 <code>返回</code> 暂时禁用一个代码块, 或者通过注释的方式暂时禁用热键或热字符串 - 可以考虑把不可到达的代码也注释掉. 另外, 也可以通过在第一行不可到达的代码上方定义一个<a href="../misc/Labels.htm">标签</a>来抑制警告.</p>
    <p><strong>All</strong>: 将给定的 <em>WarningMode</em> 应用于所有支持的警告类型.</p>
  </dd>

  <dt>WarningMode</dt>
  <dd>
    <p>类型: <a href="../Concepts.htm#strings">字符串</a></p>

    <p>表示如何发送警告的值. 如果省略, 则默认为 <em>信息框</em>.</p>
    <p><strong>信息框</strong>: 显示一个描述警告的消息框. 请注意, 一旦消息框被删除, 脚本将照常继续.</p>
    <p><strong>StdOut</strong>: 将警告的描述发送到 <em>stdout</em>(程序的标准输出流), 以及文件名和行号. 这允许像 SciTE 这样的高级编辑器在不中断脚本的情况下捕获警告 - 用户可以在以后通过编辑器的输出窗格跳转到每个违规行.</p>
    <p><strong>调试输出</strong>: 将警告的描述发送到调试器上显示. 如果调试器不是活动的, 则没有效果. 有关详情, 请参阅 <a href="OutputDebug.htm">调试输出</a>.</p>
    <p><strong>Off</strong>: 禁用给定 <em>WarningType</em> 的警告.</p>
  </dd>

</dl>
<h2 id="Remarks">备注</h2>
	<p>默认情况下, 所有的警告都是启用的并且使用 信息框 模式, 除了 LocalSameAsGlobal, 它是禁用的.</p>
	<p>警告不能在运行时启用或禁用; 其设置是在脚本加载时确定的. 因此, 在脚本中的位置并不重要(而且, 像其他 # 指令一样, #警告 不能被有条件地执行).</p>
	<p>然而, 多个 #警告 指令的顺序是很重要的: 最后出现的设置给定警告的指令决定了该警告的模式.  因此, 例如, 下面两个语句的综合效果是启用除 UseUnsetGlobal 以外的所有警告:</p>
<pre>#警告 All
#警告 UseUnsetGlobal, Off
</pre>
<h2 id="Related">相关</h2>
<p><a href="../Functions.htm#Local">局部和全局变量</a></p>
<h2 id="Examples">示例</h2>
<div class="ex" id="ExBasic">
<p><a href="#ExBasic">#1</a></p>
<pre>
#警告 All, Off                    <em>; 禁用所有警告. 不推荐.</em>
#警告                             <em>; 启用每种警告并将它们显示到消息框中.</em>
#警告 UseUnsetLocal, 调试输出  <em>; 当一个局部变量在被设置之前被使用时发出警告; 发送警告到 调试输出.</em>
</pre>
</div>

</body>
</html>